package base.list;

import base.entity.regitem.RegItem;
import base.util.RegItemUtils;
import base.util.XMLUtils;

import java.io.File;

/**
 * 根目录的类，存放根目录下的8个登记项，使用枚举实现单例模式
 * SourceDirRegItemList对象被创建，提供了一种访问其唯一的对象的方式，即SourceDirRegItemList.SIGLETON.getFat()
 * @Author: x1aolone
 * @Date: 2019/9/28 13:03
 */
public enum SrcDirRegItemsSingleton {

    INSTANCE;

    /**
     * 根目录的最大登记项数量
     */
    private final int REGITEMS_MAX_LENGTH = 8;

    /**
     * 从文件中读取根目录时需要跳过的字节数
     */
    private final int SKIP_FILE_BYTES_LENGTH = FatSingleton.INSTANCE.size();

    /**
     * 根目录下的登记项，使用数组保存
     */
    private RegItem[] regItems;

    /**
     * 构造方法，从文件中获取对象数据
     * JVM保证这个方法只调用一次，并且是私有的
     */
    SrcDirRegItemsSingleton () {
        // 使用相对路径来创建文件，java.io默认定位到当前用户目录("user.dir")下，即工程根目录
        // 相对路径的起始处无斜杆"/"
        File file = new File(XMLUtils.getFilePath("disk"));
        regItems = new RegItem[REGITEMS_MAX_LENGTH];
        for (int i = 0; i < REGITEMS_MAX_LENGTH; i++) {
            regItems[i] = RegItemUtils.read(file, i*8 + SKIP_FILE_BYTES_LENGTH);
        }
    }

    /**
     * 返回数组长度
     * @return 数组长度
     */
    public int size () {
        return REGITEMS_MAX_LENGTH;
    }

    /**
     * 返回regItems中下标为index的元素内容
     * @param index 目标元素的下标
     * @return 下标对应的元素内容
     */
    public RegItem get (int index) {
        if (0 <= index && index < REGITEMS_MAX_LENGTH) {
            RegItem regItem = regItems[index];
            // 说明是空目录项
            if (regItem == null || "$  ".equals(regItem.getName())) {
                return null;
            }
            return regItems[index];
        } else {
            return null;
        }
    }

    /**
     * 设置根目录下的登记项，找到下标为index的登记项，并把内容更改为content
     * @param index
     * @param content
     * @return
     */
    public void set (int index, RegItem content) {
        if (0 <= index && index < REGITEMS_MAX_LENGTH) {
            regItems[index] = content;
        } else {
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    /**
     * 把regItems中的内容写入文件
     */
    public void writeIntoFile() {
        // 使用相对路径来创建文件，java.io默认定位到当前用户目录("user.dir")下，即工程根目录
        // 相对路径的起始处无斜杆"/"
        File file = new File(XMLUtils.getFilePath("disk"));
        for (int i = 0; i < regItems.length; i++) {
            RegItem r = regItems[i];
            RegItemUtils.write(file, r, i*8 + SKIP_FILE_BYTES_LENGTH);
        }
    }

}
